Individual cylinder fuel control method

ABSTRACT

An improved individual cylinder fuel control method based on sampled readings of a single oxygen sensor responsive to the combined exhaust gas flow of several engine cylinders. A model-based observer is used to reproduce the imbalances of the different cylinders and a proportional-plus-integral controller is used for their elimination. Both the observer and the controller are formulated in terms of a periodic system. The observer input signal is preprocessed such that it reflects at each point of time the deviation from the current A/F-ratio mean value calculated over two engine cycles. Therefore, transient engine operating conditions do not harm the reconstruction of the cylinder imbalances dramatically. The control algorithm features process/controller synchronization based on table lookup and a mechanism to automatically adjust the mapping between the observer estimates and the corresponding cylinders if unstable control operation is detected.

TECHNICAL FIELD

This invention relates to fuel control of a multi-cylinder internal combustion engine, and more particularly a control for carrying out individual cylinder fuel control with a single exhaust gas oxygen sensor.

BACKGROUND OF THE INVENTION

Effective emission control of internal combustion engine exhaust gases with a catalytic converter requires precise control of the air/fuel ratio supplied to the engine cylinders. For this purpose, it is customary to install an oxygen sensor in the engine exhaust pipe, and to use the sensor output as a feedback signal for closed-loop fuel control. Typically, the exhaust gases of several engine cylinders are combined in an exhaust manifold with a single oxygen sensor positioned near the outlet, and an average reading of the oxygen sensor is used as a common feedback signal for controlling the fuel supplied to the several cylinders. This approach assumes a uniform air and fuel distribution among the several cylinders. However, there are frequently significant variations in air and fuel distribution among different cylinders, due to manufacturing tolerances (e.g., intake ports and fuel injectors), pressure resonance oscillations (intake manifold and fuel rail), and inhomogeneous EGR distribution. These variations cause the actual air/fuel ratio to significantly depart from the target air/fuel ratio, which tends to degenerate emission control, limit high dilution (lean burn) engine operation, deteriorate fuel economy, and possibly cause misfires.

For this reason, it has been proposed to individually trim the fuel pulse width for each engine cylinder; see, for example, the U.S. Pat. No. 5,651,353, issued on Jul. 29, 1997, and U.S. Pat. No. 5,732,689, issued on Mar. 31, 1998. Some systems of this type utilize multiple oxygen sensors for developing air/fuel ratio feedback signals unique to each cylinder. Other systems use only a single oxygen sensor for reduced cost, and utilize a mathematical model or observer to correlate the sensor readings with a given cylinder.

The model-based approach involves two basic steps: (1) recovering the cylinder imbalance pattern from the single oxygen sensor signal, and (2) mapping the recovered imbalance pattern to individual engine cylinders for purposes of trimming the individual fuel pulse widths. The first step typically involves a model-based observer which captures the dynamics of both the engine and the oxygen sensor. In a strictly time-based domain, there exist two essentially different modeling practices yielding a device to recover the cylinder imbalances from the raw oxygen sensor signal. One practice is based on transforming the rotational dynamics of the engine into a non-periodic representation using a “lifting technique”. As a result of this transformation, the imbalances pertaining to the N different cylinders are represented by one particular observer state variable, each. Thus, the entire set of state variables captures the entire imbalance pattern over one engine cycle in a time-invariant fashion. The engine can then be balanced through individually feeding each of the recovered imbalances back to the corresponding cylinder. For each cylinder, an individual feed-back loop is thus required. Alternatively, according to the second practice, the periodicity of the engine may be preserved in terms of a periodic observer in which the cylinder imbalances are shifted in a cyclic manner through the entire set of state variables. Thus, at each instant of time, the entire imbalance pattern over one full engine cycle, as generated in accordance with the cylinder firing sequence, is captured by the entire set of state variables. The controller dynamics are also modeled as a periodic system, thus lending hand to the implementation of a feed-back structure with one single loop only. The second step of mapping the recovered imbalances to the individual engine cylinders can be difficult because un-modeled process dynamics and delays give rise to a phase shift in the measurement signal which is difficult to assess in advance, and which also varies with the engine operating point. In the case of the non-periodic representation, the phase shift is manifested as an offset between the N observer state variables and the corresponding cylinders. In other words, the phase offset is represented by an integer index having value (0, 1, . . . N−1) that relates each engine cylinder to a particular recovered imbalance number. This is illustrated in FIG. 1A for a four cylinder engine, where the observer state variables are identified as x₁-x₄, and the offset has a value of two; for example, state variable x₁ is related to cylinder number three, and state variable X₃ is related to cylinder number one, etc. In the case of the periodic representation, the phase shift directly reflects the time delay between the original cylinder imbalance pattern and the recovered imbalance pattern captured in the sequence of the N observer state variables at each sampling instant. The time delay is expressed in terms of the number of sampling times and, therefore, is again characterized by an integer index having value (0, 1, . . . N−1). As illustrated in FIG. 1B, the mapping is realized by selecting that observer state variable as the input to the periodic controller, which is indicated by this number in terms of an offset with respect to first state variable. For example, by feeding-back the first state variable if the index is zero, by feeding-back the second state variable if it is one, etc.

To achieve stable individual cylinder control over an extended range of engine operating conditions, this index value can be determined for various engine operating points and stored in a look-up table, for example, as a function of engine speed and load. However, because the dynamic characteristics (i.e., the time constants and hence the phase shifts) of the engine may change over time, some of the data contained in the lookup table may become inappropriate. Therefore, it is important to monitor the operation of the control system and take corrective actions if necessary.

SUMMARY OF THE INVENTION

The present invention is directed towards an improved individual cylinder fuel control method based on sampled readings of a single oxygen sensor responsive to the combined exhaust gas flow of several engine cylinders. According to the invention, a model-based observer is used to reproduce the imbalances of the different cylinders and a proportional-plus-integral controller is used for their elimination. Both the observer and the controller are formulated in terms of a periodic system. The observer input signal is preprocessed such that it reflects at each point of time the deviation from the current A/F-ratio mean value calculated over two engine cycles. Therefore, transient engine operating conditions do not harm the reconstruction of the cylinder imbalances dramatically. The control algorithm features process/controller synchronization based on table lookup and a mechanism to automatically adjust the mapping between the observer estimates and the corresponding cylinders if unstable control operation is detected.

BRIEF DESCRIPTION OF THE DRAWINGS

FIG. 1A is a mapping diagram for a time-invariant representation of cylinder fueling imbalances.

FIG. 1B is a mapping diagram for a periodic representation of cylinder fueling imbalances.

FIG. 2 is a schematic diagram of an internal combustion engine and exhaust system according to this invention, including an electronic engine control module.

FIGS. 3-4 are flow diagrams representative of computer program instructions executed by the control module of FIG. 1 in carrying out the fuel control of this invention. FIG. 3 is a flow diagram illustrating a probing method for determining phase offset, while FIG. 4 is a flow diagram of the overall control method.

DESCRIPTION OF THE PREFERRED EMBODIMENT

Referring to the drawings, and particularly to FIG. 2, the reference numeral 10 generally designates an automotive four-cylinder internal combustion engine. Engine 10 receives intake air through an intake passage 12 that is variably restricted by a moveable throttle valve 14. Downstream of throttle valve 14, the intake air enters an intake manifold 16 for distribution to the individual engine cylinders (not shown) via a plurality of intake runners 18-24. The fuel injectors 26-32 are positioned to deliver a predetermined determined quantity of fuel to each intake runner 18-24 for combination with the intake air and admission to respective engine cylinders for combustion therein. The combustion products from each cylinder are exhausted into respective exhaust runners 34-40 of an exhaust manifold 42, and combined at a point of confluence 43 in an exhaust pipe 44, which in turn, is coupled to a catalytic converter 46 for emission control purposes.

The fuel injectors 26-32 are electrically activated by a fuel control module 50 under the control of a micro-processor based engine controller 52. Specifically, the controller 52 develops a fuel command pulse width, or injector on-time, for each of the engine cylinders, and provides the pulse width commands to fuel control module 50 via line 53, and the fuel control module activates the injectors 26-32 accordingly. The fuel pulse widths are determined in response to a number of inputs, including a manifold absolute pressure (MAP) signal on line 54, an engine speed (RPM) signal on line 56, and an oxygen sensor (Φ_(S)) signal on line 58. The MAP signal is obtained with a conventional pressure sensor 60 responsive the pressure of the intake air in intake manifold 16, and the RPM signal may be obtained from a conventional crankshaft or camshaft sensor, generally designated by the reference numeral 62. The Φ_(S) signal is obtained from a conventional wide range exhaust gas oxygen sensor 64 that provides an output voltage that varies in amplitude about a DC offset voltage in relation to the deviation of the sensed exhaust gas from a stoichiometric air/fuel ratio.

In general, the engine controller 52 determines a base fuel pulse width as a function of the RPM and MAP signals, and other inputs such as temperature and barometric pressure. Alternatively, the base fuel pulse width may be determined based on a measure of mass air flow in the intake passage 12, using a mass air flow meter up-stream of throttle plate 14. The controller 52 then adjusts the base fuel pulse width using previously learned closed-loop corrections, which are typically stored in a electrically-erasable non-volatile look-up table of controller 52 as a function of RPM and MAP. In a global type of fuel control, the adjusted base fuel pulse width is then supplied to the fuel control module 50, which activates each of the injectors 26-32 (either sequentially or concurrently) for an on-time corresponding to the adjusted base fuel pulse width. In an individual cylinder fuel control according to this invention, however, the controller 52 develops cylinder-specific fuel pulse widths by determining a correction factor for each cylinder and applying the correction factors to the adjusted base fuel pulse width. In the case of a four-cylinder engine, for example, the controller 52 supplies four cylinder-specific fuel pulse widths to fuel control module 50, which activates the individual fuel injectors 26-32 accordingly.

As indicated above, the key in individual cylinder fuel control based on a single wide range oxygen sensor is being able to recover the cylinder imbalances and associate sampled sensor signals with the exhaust gasses of an individual cylinder. Once the association is determined, individual cylinder correction factors are determined to form cylinder specific fuel pulse widths. The reconstruction of engine fueling imbalances from the signal Φ_(S) is based on the assumption that there are individual exhaust packages associated with each cylinder firing, and that each exhaust package has a characteristic impact on the Φ_(S) signal. Thus, the Φ_(S) signal provides a filtered version of the original imbalance sequence reflecting both the mixing of adjacent packages occurring in the exhaust pipe and the dynamics inherent in the sensing process.

The sensor dynamics are modeled as a first order process having an empirically determined time constant τ_(S). The sensor model is given as: $\begin{matrix} {{\frac{}{t}{\Phi_{s}(t)}} = {\frac{1}{\tau_{s}}\left\{ {{\Phi_{s}(t)} + {\Phi_{mix}(t)}} \right\}}} & (1) \end{matrix}$

where Φ_(mix)(t) denotes the A/F ratio at the sensor location and Φ_(S)(t) is the A/F ratio indicated by sensor 64. The value of Φ_(mix)(t) is dependent on the degree of mixing between the exhaust gas packages of the different cylinders. If Φ(t) denotes the A/F ratio in the exhaust package of the most recently firing cylinder at time t, and Δt denotes the time interval (t_(i)−t_(i−1)) between two engine firing events, Φ_(mix)(t) can be modeled as: $\begin{matrix} {{\Phi_{mix}(t)} = {\sum\limits_{i = 1}^{N}{{c_{i}(t)} \cdot {\Phi \left( {t - {{\left( {i - 1} \right) \cdot \Delta}\quad t}} \right)}}}} & (2) \end{matrix}$

where N is the number of firing events over one engine cycle and c_(i)(t) is a set of coefficients that weigh the influence of the exhaust packages occurring in the one engine cycle. Typically, c₁(t) has the highest value and c_(N)(t) the lowest value, meaning that the most recent exhaust package over one engine cycle contributes most and the oldest contributes least to Φ_(mix)(t).

Because the engine inherently operates in an event-based mode it is useful to formulate the complete exhaust mixing and sensing model in discrete-time notation. With k_(S)=exp{−Δt/t_(S))}, Δt=t_(k)−t_(k−1), and under consideration of equation (2), the discrete-time version of equation (1) is: $\begin{matrix} {{\Phi_{s}\left( t_{k} \right)} = {{k_{s}{\Phi_{s}\left( t_{k - 1} \right)}} + {\left( {1 - k_{s}} \right){\sum\limits_{i = 1}^{N}{c_{i}{\Phi \left( t_{k - i} \right)}}}}}} & (3) \end{matrix}$

Since the sampling events t_(k) coincide with the cylinder firing events, the weighting factors c_(i)(t) remain constant from one engine cycle to the next. However, the sampling interval Δt=t_(k)−t_(k−1) varies in accordance with the time interval between two subsequent firing events.

If ξ(t_(k)) denotes the uncorrected A/F ratio of the cylinder which fires at time t_(k) and υ(t_(k)) denotes the corresponding fuel pulse width trim factor, then the actual A/F ratio Φ(t_(k)) at sampling event t_(k) during steady state engine operation may be expressed as:

Φ(t _(k))=ξ(t _(k) )·ν(t _(k))  (4)

Equations (3) and (4) represent the target system for the controller design with ν(t_(k)) as the input and Φ_(S)(t) as the output variable. Wall-wetting and intake manifold dynamics can be neglected as long as the changes in the trim factor υ(t_(k)) are slow compared to the time constants of the wall-wetting and the manifold dynamics. However, equations (3) and (4) do not account for any delays occurring in the real process. Accordingly, it is useful to define a nominal or average A/F trajectory of a balanced engine, and to define the observer variables in terms of their deviation from the nominal trajectory. The nominal trajectory over two engine revolutions is identified by the terms Φ*, ξ*, υ*, and is defined as follows: $\begin{matrix} {{{\Phi^{*}\left( t_{k} \right)} = {\frac{1}{2N}{\sum\limits_{i = {k - N}}^{k + N - 1}{\Phi_{s}\left( t_{i} \right)}}}},{{\xi^{*}\left( t_{k} \right)} = {\Phi^{*}\left( t_{k} \right)}},{{\upsilon^{*}\left( t_{k} \right)} = 1}} & (5) \end{matrix}$

This nominal trajectory is essentially a filtered version of the measured A/F ratio, and enhances those constituents of the measured A/F ratio that contain the cylinder imbalance pattern, while attenuating those constituents attributable to noise and transient engine operation. The observer deviation variables ψ_(s)(t_(k)), ψ(t_(k)), x(t_(k)), u(t_(k)) are then defined as:

ψ_(s)(t _(k))=Φ_(s)(t _(k))−Φ*(t _(k))

ψ(t _(k))=Φ(t _(k))−Φ*(t _(k))

x(t _(k))=ξ(t _(k))−ξ*(t _(k))

u(t _(k))=υ(t _(k))−ν*  (6)

where ψ_(s)(t_(k)) is the sensed A/F ratio imbalance, ψ(t_(k)) is the actual A/F ratio imbalance, x(t_(k)) is the original cylinder A/F ratio imbalance, and u(t_(k)) is the trim signal, assuming slow changes in Φ* and an engine operating condition close to stoichiometry. Equation (4) may then the expressed in terms of equations (6) for one distinct cylinder as follows:

ψ(t _(k))=x(t _(k))+u(t _(k))  )7)

By the same token, using the definitions given in equations (6) and introducing $\begin{matrix} {{\phi_{mix}\left( t_{k - 1} \right)} = {\sum\limits_{i = 1}^{N}{c_{i}{\phi \left( t_{k - i} \right)}}}} & (8) \end{matrix}$

from equation (2), the sensor dynamics equation (3) can be expressed as follows:

ψ_(S)(t _(k))=k _(S)ψ_(S)(t _(k−1))+(1−k _(S))ψ_(mix)(t _(k−1))  (9)

Obviously, the infinite sequence of cylinder imbalances x(t_(k)) in equation (7) is periodic with period N; i.e., x(t_(k))=x(t_(k−N)). The sequence can be generated by applying the following recursive procedure: $\begin{matrix} {{{x_{1}\left( t_{k} \right)} = {x_{N}\left( t_{k - 1} \right)}}{{x_{2}\left( t_{k} \right)} = {x_{1}\left( t_{k - 1} \right)}}\quad \vdots {{x_{N}\left( t_{k} \right)} = {x_{N - 1}\left( t_{k - 1} \right)}}{{{x\left( t_{k} \right)} = {{{x_{1}\left( t_{k} \right)}\quad {x_{i}(0)}} = {{{\overset{\_}{x}}_{i}\quad i} = 1}}},\cdots \quad,N}} & (10) \end{matrix}$

where {overscore (x)}_(i) is the uncorrected imbalance of the ith cylinder. Equation (10) implies that each state variable x_(i) assumes each cylinder imbalance in a repetitive pattern with a period of one engine cycle. Furthermore, all state variables have identical patterns but the pattern of each variable is shifted with respect to the previous variable by one sampling event. That is, each state variable x_(i)(t_(k)) reflects at one particular sampling point the imbalance of one particular cylinder and at the next sampling point the imbalance of the succeeding cylinder (in terms of the firing sequence) and so on. Thus, the time series captured in each component of equation (10) reflects the periodically varying equivalence ratio pattern at the confluence point 43 in the exhaust pipe 44 for the case that the trim variables u(t_(k)) are zero. Of course, a representation similar to equation (10) can be found to characterize the periodicity of the required trim variables: $\begin{matrix} {{{u_{1}\left( t_{k} \right)} = {{u_{N}\left( t_{k - 1} \right)} + {\Delta \quad {u\left( t_{k - 1} \right)}}}}{{{u_{2}\left( t_{k} \right)} = {{{u_{1}\left( t_{k - 1} \right)}\quad \vdots {u_{N}\left( t_{k} \right)}} = {{{u_{N - 1}\left( t_{k - 1} \right)}{u\left( t_{k} \right)}} = {{{u_{1}\left( t_{k} \right)}\quad {u_{i}(0)}} = {{0\quad i} = 1}}}}},\cdots \quad,N}} & (11) \end{matrix}$

The term Δu(t_(k−1)) denotes the trim adjustment or the control input needed to gradually balance the cylinders. Obviously, Δu(t_(k−1))=0 for balanced cylinders.

Defining ψ_(i)(t_(k))=x_(i)(t_(k))+u_(i)(t_(k)), i=1, . . . , N, and summing the components of equations (10) and (11), respectively, it follows from equation (7) that: $\begin{matrix} {{{\phi_{1}\left( t_{k} \right)} = {{\phi_{N}\left( t_{k - 1} \right)} + {\Delta \quad {u\left( t_{k - 1} \right)}}}}{{\phi_{2}\left( t_{k} \right)} = {\phi_{1}\left( t_{k - 1} \right)}}\quad \vdots {{\phi_{N}\left( t_{k} \right)} = {\phi_{N - 1}\left( t_{k - 1} \right)}}{{\phi \left( t_{k} \right)} = {\phi_{1}\left( t_{k} \right)}}} & (12) \end{matrix}$

Equation (12) describes the behavior of the A/F ratio imbalances as perceived at the confluence point 43 of the exhaust system. From equations (8), (9) and (12), the following overall system representation can be obtained: $\begin{matrix} {{{\phi_{1}\left( t_{k} \right)} = {{\phi_{N}\left( t_{k - 1} \right)} + {\Delta \quad {u\left( t_{k - 1} \right)}}}}{{\phi_{2}\left( t_{k} \right)} = {\phi_{1}\left( t_{k - 1} \right)}}\quad \vdots {{\phi_{N}\left( t_{k} \right)} = {\phi_{N - 1}\left( t_{k - 1} \right)}}{{\phi_{s}\left( t_{k} \right)} = {{{k_{s}{\phi_{s}\left( t_{k - 1} \right)}} + {\left( {1 - k_{s}} \right){\sum\limits_{i = 1}^{N}c_{i}}}}{\phi_{i}\left( t_{k - 1} \right)}}}} & (13) \end{matrix}$

Introducing ψ(t_(k))=[ψ₁(t_(k)) . . . ψ_(N)(t_(k))ψ_(S)(t_(k))]^(T), equation (13) can be expressed in vector notation as

ψ(t _(k))=A ψ(t _(k−1))+BΔu(t _(k−1))

y(t _(k))=ψ_(S)(t _(k))=C ψ(t _(k))  (14)

where AεR^((N+1)×(N+1)), BεR^((N+1)×1), CεR^(1×(N+1)), and ${A = \begin{bmatrix} 0 & 0 & \cdots & 0 & 1 & 0 \\ 1 & 0 & \cdots & 0 & 0 & 0 \\ 0 & 1 & ⋰ & \vdots & \vdots & \vdots \\ \vdots & \quad & ⋰ & 0 & 0 & 0 \\ 0 & \quad & \quad & 1 & 0 & 0 \\ {c_{1}\left( {1 - k_{s}} \right)} & {c_{2}\left( {1 - k_{s}} \right)} & \cdots & {c_{N - 1}\left( {1 - k_{s}} \right)} & {c_{N}\left( {1 - k_{s}} \right)} & k_{s} \end{bmatrix}},{B = \begin{bmatrix} 1 \\ 0 \\ \vdots \\ 0 \end{bmatrix}},{C = {\left\lbrack {0\quad \cdots \quad 01} \right\rbrack.}}$

Equation (14) represents a dynamic model for those A/F ratio excursions in the exhaust gas which are solely due to cylinder imbalances, and provides a convenient basis for the design of an observer to recover the A/F-ratio imbalances appearing in the exhaust gas packages. Although equation (14) implies that the trim variable is an inherent part of the plant, the fuel controller requires the trim input in the form of equation (4); hence

υ(t _(k))=f _(avg) +u(t _(k))=f _(avg) +u _(N)(t _(k−1))+Δu(t _(k−1))  (15)

where f_(avg) denotes a multiplier which allows for adjusting the average A/F-ratio setpoint.

It is assumed that the trim adjustment Δu(t_(k)) is relatively small compared to the cylinder imbalances. Thus, the input term in equation (14) can be omitted for the observer design. With ${\hat{\underset{\_}{\phi}}\left( t_{k} \right)} \in R^{N + 1}$

denoting an estimate of ψ(t_(k)) and Â=A−ΔA where ΔA represents modeling errors associated with the sensor and the mixing dynamics, i.e., $\begin{matrix} {{\hat{A} = \begin{bmatrix} 0 & 0 & \cdots & 0 & 1 & 0 \\ 1 & 0 & \cdots & 0 & 0 & 0 \\ 0 & 1 & ⋰ & \vdots & \vdots & \vdots \\ \vdots & \quad & ⋰ & 0 & 0 & 0 \\ 0 & \quad & \quad & 1 & 0 & 0 \\ {{\hat{c}}_{1}\left( {1 - {\hat{k}}_{s}} \right)} & {{\hat{c}}_{2}\left( {1 - {\hat{k}}_{s}} \right)} & \cdots & {{\hat{c}}_{N - 1}\left( {1 - {\hat{k}}_{s}} \right)} & {{\hat{c}}_{N}\left( {1 - {\hat{k}}_{s}} \right)} & {\hat{k}}_{s} \end{bmatrix}},} & (16) \\ {\quad {{\Delta \quad A} = \begin{bmatrix} 0 & \cdots & 0 \\ \vdots & \quad & \vdots \\ 0 & \cdots & 0 \\ {\Delta \quad a_{{N + 1},1}} & \cdots & {\Delta \quad a_{{N + 1},{N + 1}}} \end{bmatrix}}\quad} & \quad \end{matrix}$

the following general state-space representation for the observer can be found: $\begin{matrix} \begin{matrix} {{\hat{\underset{\_}{\phi}}\left( t_{k} \right)} = \quad {{\hat{A}\quad {\hat{\underset{\_}{\phi}}\left( t_{k - 1} \right)}} + {K\left\lbrack {{y\left( t_{k - 1} \right)} - {C\quad {\hat{\underset{\_}{\phi}}\left( t_{k - 1} \right)}}} \right\rbrack}}} \\ {= \quad {{\left\lbrack {\hat{A} - {K\quad C}} \right\rbrack {\hat{\underset{\_}{\phi}}\left( t_{k - 1} \right)}} + {K\quad {y\left( t_{k - 1} \right)}}}} \\ {{\hat{y}\left( t_{k} \right)} = \quad {C\quad {\hat{\underset{\_}{\phi}}\left( t_{k} \right)}}} \end{matrix} & (17) \end{matrix}$

The constant Kalman gain vector KεR^(N+1) is calculated according to

K=MC ^(T) S ⁻¹  (18)

where MεR^((N+1)×(N+1)) is computed iteratively from

M=P−PC ^(T)(CPC ^(T) +S)⁻¹ CP

P=ÂMÂ ^(T) +Q  (19)

Strictly speaking, the matrices SεR and QεR^((N+1)×(N+1)) reflect statistical properties of the input and output signals of the real process. In the present context, however, they are merely used as design parameters for the filter.

Equation (11) implies that integral control action is required to avoid steady state cylinder trim errors. In the present approach a simple proportional-plus-integral (PI) controller is designed to meet this requirement. The controller is given as $\begin{matrix} \begin{matrix} {{z_{1}\left( t_{k} \right)} = \quad {{z_{N}\left( t_{k - 1} \right)} + {e\left( t_{k} \right)}}} \\ {{z_{2}\left( t_{k} \right)} = \quad {z_{1}\left( t_{k - 1} \right)}} \\ {\vdots \quad} \\ {{z_{N}\left( t_{k} \right)} = \quad {z_{N - 1}\left( t_{k - 1} \right)}} \\ {{u\left( t_{k} \right)} = \quad {{{- k_{i}}{z_{1}\left( t_{k} \right)}} - {k_{p}{e\left( t_{k} \right)}}}} \end{matrix} & (20) \end{matrix}$

where u(t_(k)) determines the control input to the engine injection system (see equation (15)), and e(t_(k)), reflects the A/F ratio imbalance appearing in the exhaust package of that cylinder which is linked to the variable u(t_(k)).

Introducing the vector components u₁(t_(k))=u(t_(k)), u₂(t_(k))=u(t_(k−1)), . . . , u_(N)(t_(k))=u(t_(k−N+1)), equation (20) translates into $\begin{matrix} \begin{matrix} {{z_{1}\left( t_{k} \right)} = \quad {{z_{N}\left( t_{k - 1} \right)} + {e\left( t_{k - 1} \right)}}} \\ {{z_{2}\left( t_{k} \right)} = \quad {z_{1}\left( t_{k - 1} \right)}} \\ {\vdots \quad} \\ {{z_{N}\left( t_{k} \right)} = \quad {z_{N - 1}\left( t_{k - 1} \right)}} \\ {{u_{1}\left( t_{k} \right)} = \quad {{{{- k_{i}}{z_{1}\left( t_{k} \right)}} - {k_{p}{e\left( t_{k - 1} \right)}}} = {{{- k_{i}}{z_{N}\left( t_{k - 1} \right)}} - {\left( {k_{i} + k_{p}} \right){e\left( t_{k - 1} \right)}}}}} \\ {{u_{2}\left( t_{k} \right)} = \quad {u_{1}\left( t_{k - 1} \right)}} \\ {\vdots \quad} \\ {{u_{N}\left( t_{k} \right)} = \quad {u_{N - 1}\left( t_{k - 1} \right)}} \end{matrix} & (21) \end{matrix}$

or in vector notation with z(t_(k))=[z₁(t_(k)) . . . z_(N)(t_(k))]^(T) and

u(t_(k))=[u₁(t_(k)) . . . u_(N)(t_(k))]^(T)

z (t _(k))=Fz (t _(k−1))+Ge(t _(k−1))

u (t _(k))=Lu (t _(k−1))+Mzl (t _(k−1))+Ne(t_(k−1))  (22)

where F, L, MεR^(N×N), G, NεR^(N×1), and, ${F = \begin{bmatrix} 0 & \cdots & 0 & 1 \\ 1 & 0 & \cdots & 0 \\ 0 & ⋰ & \quad & \vdots \\ 0 & \cdots & 1 & 0 \end{bmatrix}},{L = \begin{bmatrix} 0 & \cdots & \cdots & 0 \\ 1 & 0 & \cdots & 0 \\ 0 & ⋰ & \quad & \vdots \\ 0 & \cdots & 1 & 0 \end{bmatrix}},{G = \begin{bmatrix} 1 \\ 0 \\ \vdots \\ 0 \end{bmatrix}},{M = \begin{bmatrix} 0 & \cdots & 0 & {- k_{i}} \\ 0 & \cdots & \cdots & 0 \\ \vdots & \quad & \quad & \vdots \\ 0 & \cdots & \cdots & 0 \end{bmatrix}},{N = \begin{bmatrix} {- \left( {k_{i} + k_{p}} \right)} \\ 0 \\ \vdots \\ 0 \end{bmatrix}}$

Of course equation (21) is equivalent to equation (11) where Δu(t_(k−1))≡u₁(t_(k))−u_(N)(t_(k−1)). Hence $\begin{matrix} \begin{matrix} {{\Delta \quad {u\left( t_{k - 1} \right)}} = \quad {{{- k_{i}}{z_{N}\left( t_{k - 1} \right)}} - {\left( {k_{i} + k_{p}} \right){e\left( t_{k - 1} \right)}} - {u_{N}\left( t_{k - 1} \right)}}} \\ {= \quad {{U_{z}{\underset{\_}{z}\left( t_{k - 1} \right)}} + {U_{u}{\underset{\_}{u}\left( t_{k - 1} \right)}} + {{Ve}\left( t_{k - 1} \right)}}} \end{matrix} & (23) \end{matrix}$

with U_(z), U_(u)εR^(N×1), VεR, and,

U_(z)=[0 . . . 0−k_(i)], U_(u)=[0 . . . 0−1], V=−(k_(i)+k_(p))

Furthermore, the error signal e(t_(k−1)) can be described as $\begin{matrix} {{e\left( t_{k - 1} \right)} = {{H\quad {\underset{\_}{\hat{\phi}}\left( t_{k} \right)}} = {{{H\left\lbrack {\hat{A} - {KC}} \right\rbrack}{\hat{\underset{\_}{\phi}}\left( t_{k - 1} \right)}} + {{HKy}\left( t_{k - 1} \right)}}}} & (24) \end{matrix}$

where H=[δ_(0,index)δ_(1,index) . . . δ_(N,index)] and δ_(i,j) is the Kronecker delta, i.e., δ_(i,j)=0 for all i≠j and δ_(i,i)=1. The quantity index is an integer number between 0 and N−1. It is equal to zero if the true system is exactly represented by equation (14) but may be different in the presence of unmodeled delays and dynamics. This issue is addressed below in respect to synchronization.

With (23) and (24) the complete state-space representation of the controller is given as:

z (t _(k))=Fz (t _(k−1))+Ge(t _(k−1))

u (t _(k))=Lu (t _(k−1))+Mz (t _(k−1))+Ne(t _(k−1))

Δu(t _(k−1))=U _(z) z (t _(k−1))+U _(u) u (t _(k−1))+Ve(t _(k−1))  (25)

with e(t_(k−1)) is calculated according to equation (24).

The complete compensator involves the observer and controller described in equations (17) and (25), respectively. Introducing ${{\underset{\_}{\zeta}\left( t_{k} \right)} = \left\lbrack {{\underset{\_}{\hat{\phi}}\left( t_{k} \right)}{\underset{\_}{z}\left( t_{k} \right)}{\underset{\_}{u}\left( t_{k} \right)}} \right\rbrack^{T}},$

the compact compensator dynamics are given as follows

ζ(t _(k))=A _(c) ζ(t _(k−1))+B _(c) y(t _(k−1))

Δu(t _(k−1))=C _(c) ζ(t _(k−1))+D _(c) y(t _(k−1))  (26)

where $\begin{matrix} {{A_{c} = {\begin{bmatrix} {\hat{A} - {KC}} & 0 & 0 \\ {{GH}\left\lbrack {\hat{A} - {KC}} \right\rbrack} & F & 0 \\ {{NH}\left\lbrack {\hat{A} - {KC}} \right\rbrack} & M & L \end{bmatrix} \in R^{{({{3N} + 1})} \times {({{3N} + 1})}}}},} & {B_{c} = {\begin{bmatrix} K \\ {GHK} \\ {NHK} \end{bmatrix} \in R^{{3N} + 1}}} \\ {{C_{c} = {\left\lbrack {{{VH}\left\lbrack {\hat{A} - {KC}} \right\rbrack}U_{z}U_{u}} \right\rbrack \in R^{{3N} + 1}}},} & {D_{c} = {{VHK} \in R}} \end{matrix}$

As mentioned above, the synchronization between the controller and the observer is a matter of identifying the variable index which determines the matrix H contained in the system matrices of (26). By synchronizing the observer and the controller in a particular way the correct mapping between the cylinders and the recovered imbalances can be established. The equation (14) represents a discrete model of a process involving both continuous time (sensor, gas flow in the exhaust manifold) and discrete time (event-driven operation of the cylinders) dynamic parts. In addition to the dynamics captured by this model the real process includes continuous transport delays which introduce a phase shift between the measurement signal and the model output. By the same token, the delays induce a phase shift between the original imbalance pattern ψ(t_(k)), ψ(t_(k−1)), . . . , ψ(t_(k−N+1)) and the recovered pattern contained in the first N components {circumflex over (ψ)}₁(t_(k)), . . . , {circumflex over (ψ)}_(N)(t_(k)) of the observer state vector ${\underset{\_}{\hat{\phi}}\left( t_{k} \right)}.$

For stable individual cylinder feed-back control, however, it is imperative to identify this phase shift so that each imbalance extracted from the measurement information may be associated with its corresponding cylinder. For that matter, as illustrated in FIG. 3, it is sufficient to identify the phase shift as a fraction of the time of one period. This fraction can be expressed in terms of sampling events as a number index with 0≦index≦N−1. It is a characteristic parameter for each operating point and indicates that at a given time event t_(k) the imbalance contained in component (1+index) of $\underset{\_}{\hat{\phi}}\left( t_{k} \right)$

relates to the cylinder which is subject to the current control variable u(t_(k)); see equation (20).

As indicated above, an important aspect of this invention involves monitoring the system performance under closed-loop control, and, if necessary, adjusting the calibration setting. To monitor the system performance consider the performance measure $\begin{matrix} {{\sigma \left( t_{k} \right)} = {\sum\limits_{i = 1}^{N}{{\phi \left( t_{k - i + 1} \right)}}}} & (27) \end{matrix}$

i.e., the sum of the absolute values of the exhaust package imbalances ψ(t_(k)) over one engine cycle. Since stable individual cylinder control operation by definition implies initially decreasing and then non-increasing imbalances, the trend of the quantity represented by equation (27) can be transformed into a very sensitive stability criterion. However, the true values of the imbalances ψ(t_(k)) are not available. Therefore, the performance measure σ(t_(k)) is calculated using the estimated imbalance values provided by the observer (first N components of equation (17)), i.e.: $\begin{matrix} {{\sigma \left( t_{k} \right)} = {\sum\limits_{i = 1}^{N}{{{\hat{\phi}}_{i}\left( t_{k} \right)}}}} & (28) \end{matrix}$

For any given initial cylinder imbalances stable operation of the individual cylinder control algorithm is characterized by a gradual decrease of the performance measure σ(t_(k)) and vice-versa. Moreover, for stable control operation there exist a time t_(c) and value σ_(max) so that $\begin{matrix} {\sigma_{\max} \geq {\max\limits_{t_{k}}{\left( {\sigma \left( t_{k} \right)} \right){\forall{t_{k} \geq t_{c}}}}}} & (29) \end{matrix}$

The quantity σ_(max) represents an upper bound of σ(t_(k)) for a balanced engine which is specific for each engine operating point. Based on (28) and (29), the criterion indicating unstable control operation is now defined as follows:

σ(t _(k))>k _(tol)·σ_(crit)(t _(k))  (30)

where $\begin{matrix} {{\sigma_{crit}\left( t_{k} \right)} = \left\{ \begin{matrix} {\max \left( {{\sigma \left( t_{k} \right)},\sigma_{\max}} \right)} & {{{if}\quad {\sigma \left( t_{k} \right)}} \leq {\sigma_{crit}\left( t_{k - 1} \right)}} \\ {\sigma_{crit}\left( t_{k - 1} \right)} & {else} \end{matrix} \right.} & (31) \end{matrix}$

and k_(tol)>1 can be thought of as a factor providing sufficient tolerance with respect to natural variations and noise components appearing in σ(t_(k)).

The present invention comprehends two alternative methods of identifying the phase offset discussed above if unstable operation is indicated by the performance criterion of equation (30). According to a first embodiment, the phase offset is determined by a trial and error method involving an initial guess of the phase variable index. The control algorithm is executed under the assumption that index represents the true phase offset. If the cylinder imbalances are converging towards zero it is concluded that the initial guess was indeed correct and no action is taken. If not (that is, if the performance criteria of the control system indicates unstable operation), the offset variable index is incremented, the integrators of the controller are reset, and the control algorithm is restarted. This procedure is repeated until stable control operation is achieved. In an N cylinder engine this process involves at most N-1 erroneous trials, including the initial step.

According to a second embodiment, illustrated by the flow diagram of FIG. 3, the phase offset is determined by a probing method in which a periodic probing signal du (calculated at block 116) with |du|=f_(p), f_(p)≧0 is superposed on the control input u for one particular cylinder, and the maximal response of the recovered imbalance pattern is identified. Probing is applied during an even number N_(p) of engine firing events, as indicated at block 100. While the system is probed the adjustment term Δu in equation (11) is set to zero so that no undesired feedback occurs. The algorithm variables, in particular the counter variables, the logic variables, and the integrator state variables are initialized at the beginning of the engine start-up. Referring to FIG. 3, the periodic counter variable evnt_cnt (checked at block 102) is incremented on each engine event and reset after one complete engine cycle. Initially, the counter variable is equal to zero, and block 106 sets the variable mask to zero; in the next engine event, the block 104 sets mask to one, and changes the sign of the variable toggle, which is initialized to one at block 132 if the performance criterion of equation (30) indicates unstable control operation. The pert flag (checked at block 108) indicates that the algorithm is presently involved in a probing sequence. In the probing sequence, summarized in block 110, the counter variable pert_cnt is incremented to accumulate the number of engine events which have occurred during the probing intervals. When the counter reaches the reference N_(p) (an even multiple of N; see block 100), as determined at block 112, the block 114 resets the counter variable, the pert flag, the variable toggle, and initializes a count-down variable wait_cnt. If the algorithm is not presently involved in a probing sequence, the block 118 checks the status of the wait flag, which is set at block 100 if the count in wait_cnt is positive. When the wait flag is set, block 120 decrements wait_cnt, and the performance criteria of equation (30) is evaluated at block 122 once wait_cnt has been decremented to zero, representing a certain number of sampling events. At indicated at block 122, the trig_sync flag is set if the performance criterion of equation (30) indicates unstable control operation. If the trig_sync flag is not set, as determined at block 124, the block 126 computes the error input variable e(t_(k−1)) using equation (24). If the trig_sync flag is set, the block 128 sets the error input variable e(t_(k−1)) to zero, and the block 130 checks the status of the counter variable evnt_cnt. As soon as the counter attains a value of one, the block 132 sets the pert flag, reset the trig_sync flag, and sets the variable toggle equal to one.

In the course of a probing sequence the calculation of du(t_(k)), computed at block 116, is as follows:

 du(t _(k))=mask(t _(k))·toggle(t _(k))·f _(p)  (32)

where ${{mask}\left( t_{k} \right)} = \left\{ {{\begin{matrix} 1 & {{if}\quad \left( {{{evnt}\quad \_ \quad {cnt}} = 1} \right)} \\ 0 & {else} \end{matrix}{and}{{toggle}\left( t_{k} \right)}} = \left\{ \begin{matrix} {- {{toggle}\left( t_{k - 1} \right)}} & {{if}\quad \left( {{{evnt}\quad \_ \quad {cnt}} = 1} \right)} \\ {{toggle}\left( t_{k - 1} \right)} & {{else}.} \end{matrix} \right.} \right.$

To avoid feedback actions which counteract the perturbation signal du(t_(k)) the error input variable e(t_(k−1)) in equation (25) is set to zero while pert is true. Hence, during the course of a probing interval the trim signal u(t_(k)) is given by $\begin{matrix} \begin{matrix} {{z_{1}\left( t_{k} \right)} = \quad {z_{N}\left( t_{k - 1} \right)}} \\ {{z_{2}\left( t_{k} \right)} = \quad {z_{1}\left( t_{k - 1} \right)}} \\ {\vdots \quad} \\ {{z_{N}\left( t_{k} \right)} = \quad {z_{N - 1}\left( t_{k - 1} \right)}} \\ {{u\left( t_{k} \right)} = \quad {{{- k_{i}}{z_{1}\left( t_{k} \right)}} + {{du}\left( t_{k} \right)}}} \end{matrix} & (33) \end{matrix}$

From equation (32) it is apparent that in each of two subsequent engine cycles the mixture of the probed cylinder is shifted from lean to rich or vice-versa thus inducing a two engine cycle periodic pattern in the exhaust equivalence ratio. To recover the corresponding imbalance pattern during probing, the number of state variables in the observer equation (17) must be increased by N. Then, each N of the first 2N observer state variables capture the effect of a probing sequence with opposite probing amplitude while the last state variable again represent the sensor output. However, under normal control operation (no probing) the observer must still satisfy equation (17). To be compatible with both conditions the following observer structure is adopted: $\begin{matrix} \begin{matrix} {{{\underset{\_}{\hat{\phi}}}_{p}\left( t_{k} \right)} = {{{\hat{A}}_{p}{{\underset{\_}{\hat{\phi}}}_{p}\left( t_{k - 1} \right)}} + {K_{p}\left\lbrack {{y\left( t_{k - 1} \right)} - {C_{p}{{\underset{\_}{\hat{\phi}}}_{p}\left( t_{k - 1} \right)}}} \right\rbrack}}} \\ {{\hat{y}\left( t_{k} \right)} = {C_{p}{{\underset{\_}{\hat{\phi}}}_{p}\left( t_{k} \right)}}} \end{matrix} & (34) \end{matrix}$

where C_(p)=[0 . . . 01]εR^(1×(2N+1)), K_(p)=[k₁ . . . k_(N)0 . . . 0k_(N+1)]^(T)εR^((2N+1)×1), with k₁, . . . , k_(N+1) denoting the components of K (see EQs (19),(20),(21)), and the modified system matrix $\begin{matrix} {{\hat{A}}_{p} = {\begin{bmatrix} 0 & \cdots & \quad & 0 & \delta_{{no}\quad \_ \quad {pert}} & 0 & 0 & \delta_{pert} & 0 \\ 1 & 0 & \cdots & \quad & \quad & \quad & \quad & 0 & 0 \\ 0 & 1 & 0 & \quad & \vdots & \quad & \quad & \vdots & \vdots \\ \vdots & \quad & ⋰ & ⋰ & \quad & \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad & \quad & {⋰\quad} & {0\quad} & {0\quad} & {0\quad} \\ {\quad 0} & {\cdots \quad} & {\quad \cdots} & \quad & \quad & 0 & 1 & 0 & 0 \\ {\quad {{\hat{c}}_{1}\left( {1 - {\hat{k}}_{s}} \right)}\quad} & \quad & \cdots & \quad & {\quad {{\hat{c}}_{N}\left( {1 - {\hat{k}}_{s}} \right)}} & 0 & {\cdots \quad} & 0 & {\hat{k}}_{s} \end{bmatrix} \in}} \\ R^{{({{2N} + 1})} \times {({{2N} + 1})}} \end{matrix}$

involves the components $\delta_{pert} = \left\{ {{\begin{matrix} 1 & {{if}\quad ({pert})} \\ 0 & {else} \end{matrix}\quad {and}\quad \delta_{{no}\quad \_ \quad {pert}}} = \left\{ \begin{matrix} 0 & {{if}\quad ({pert})} \\ 1 & {{else}.} \end{matrix} \right.} \right.$

The condition pert_cnt=N_(p) (detected at block 112) marks the end point t_(pe) of the probing interval. At this point (block 114) the counter variable pert_cnt is reset and the flag pert is set to false.

To obtain the required parameter index two vectors ${{\underset{\_}{\varphi}}_{1}\left( t_{k} \right)} = {{\left\lbrack {{{\hat{\phi}}_{1}\left( t_{k} \right)}\quad \cdots \quad {{\hat{\phi}}_{N}\left( t_{k} \right)}} \right\rbrack^{T}\quad {and}\quad {{\underset{\_}{\varphi}}_{2}\left( t_{k} \right)}} = \left\lbrack {{{\hat{\phi}}_{N + 1}\left( t_{k} \right)}\quad \cdots \quad {{\hat{\phi}}_{2N}\left( t_{k} \right)}} \right\rbrack^{T}}$

containing the recovered imbalance sequences of two consecutive engine cycles at time t_(k), respectively, and the difference vector $\begin{matrix} {{d\quad {\underset{\_}{\varphi}\left( t_{k} \right)}} = {{{\underset{\_}{\varphi}}_{2}\left( t_{k} \right)} - {{\underset{\_}{\varphi}}_{1}\left( t_{k} \right)}}} & (35) \end{matrix}$

are introduced. The phase offset index is obtained at the end of the probing interval by identifying that row number of equation (35) containing the maximum absolute value, and subtracting one from that number, i.e., $\begin{matrix} {{index} = {{\max\limits_{i}{{d\quad {\varphi_{i}\left( t_{pe} \right)}}}} - 1}} & (36) \end{matrix}$

where dΦ_(i)(t_(pe)) is the element in the ith row of dΦ(t_(pe)).

Finally, to disable rescheduling of the probing mechanism during and immediately after the end of a probing interval the threshold variable σ_(crit) (see equation (31)) is reevaluated as follows: $\begin{matrix} {{\sigma_{crit}\left( t_{k} \right)} = \left\{ \begin{matrix} {\max \left( {{\sigma \left( t_{k} \right)},\sigma_{\max}} \right)} & {{if}\quad \left( {({pert})\quad {or}\quad ({wait})} \right)} \\ {\sigma_{crit}\left( t_{k - 1} \right)} & {else} \end{matrix} \right.} & (37) \end{matrix}$

It is important to note at this point that probing can only be applied successfully if the engine is running under steady-state operating conditions.

The previous discussion is based on the assumption that equation (36) has always a unique solution index. In practice, however, the index will change as the engine shifts from one operating point to another. Consequently, there exist operating points where adjacent components of dΦ have the same (maximum) value, so that the evaluation of equation (37) becomes ambiguous. Of course, the engine operating envelope encompasses many different operating points where ambiguity conditions apply. Moreover, the effects of process noise extend the scope of ambiguity far beyond the range of an infinitesimally small operating region so that equation (37) may produce erroneous results any time the engine is operating close to an ambiguity point. The ambiguity problem can be mitigated to a degree of negligible statistical significance by increasing the sampling frequency such that the sensor signal is sampled at least twice per firing event. In order to capture the increased number of sampled data points comprehended in one engine event, the number of state variables in the observer is adjusted with l=qN, qεN₊ denoting the number of sampling events per engine event so that t_(j)−t_(j−q)=t_(k)−t_(k−1)∀j=q·k, and t_(j)−t_(j−1) is equivalent to the time elapsing between two sampling events. In this case, the observer state vectors are given as ${\hat{\underset{\_}{\phi}}\left( t_{j} \right)} \in R^{l + 1}$

(without probing) and ${{\hat{\underset{\_}{\phi}}}_{p}\left( t_{j} \right)} \in R^{{2l} + 1}$

(with probing).

Without probing, and referring to equation (18), the system parameters may be modified as follows: $\begin{matrix} \begin{matrix} {{\hat{k}}_{s} = \quad {\exp \left\{ {{- \left( {t_{j} - t_{j - 1}} \right)}/{\hat{\tau}}_{s}} \right\}}} \\ {\hat{A} = \quad {\begin{bmatrix} 0 & 0 & \cdots & 0 & 1 & 0 \\ 1 & 0 & \cdots & 0 & 0 & 0 \\ 0 & 1 & ⋰ & \vdots & \vdots & \vdots \\ \vdots & \quad & ⋰ & 0 & 0 & 0 \\ 0 & \quad & \quad & 1 & 0 & 0 \\ {c_{1}\left( {1 - {\hat{k}}_{s}} \right)} & {c_{2}\left( {1 - {\hat{k}}_{s}} \right)} & \cdots & {c_{l - 1}\left( {1 - {\hat{k}}_{s}} \right)} & {c_{l}\left( {1 - {\hat{k}}_{s}} \right)} & {\hat{k}}_{s} \end{bmatrix} \in}} \\ {\quad R^{{({l + 1})} \times {({l + 1})}}} \\ {C = \quad {\begin{bmatrix} 0 & \cdots & 0 & 1 \end{bmatrix} \in R^{1 \times {({l + 1})}}}} \\ {K = \quad \left\lbrack \begin{matrix} k_{1} & \cdots & {\left. \left. \left( k_{l + 1} \right. \right\rbrack \right)^{T} \in R^{l + 1}} \end{matrix} \right.} \end{matrix} & (38) \end{matrix}$

where the constant Kalman gain matrix K is calculated according to equation (19), MεR^((l+1)×(l+1)) is calculated from equation (20) with Â, C as described in equation (38), and SεR, and QεR^((l+1)×(l+1)). With equation (38) the basic observer (sampled q times per firing event) is given as $\begin{matrix} \begin{matrix} {{\underset{\_}{\hat{\phi}}\left( t_{j} \right)} = {{\left\lbrack {\hat{A} - {KC}} \right\rbrack {\hat{\underset{\_}{\phi}}\left( t_{j - 1} \right)}} + {{Ky}\left( t_{j - 1} \right)}}} \\ {{\hat{y}\left( t_{j} \right)} = {C\quad {\hat{\underset{\_}{\phi}}\left( t_{j} \right)}}} \end{matrix} & (39) \end{matrix}$

and the corresponding controller (sampled once per firing event)

  z (t _(k))=Fz (t _(k−1))+Ge(t _(k−1))

u (t _(k))=Lu (t _(k−1))+Mz (t _(k−1))+Ne(t _(k−1))

Δu(t _(k−1))=U _(z) z (t _(k−1))+U _(u) u (t _(k−1))+Ve(t _(k−1))  (40)

with ${{e\left( t_{k - 1} \right)} = {H\quad {\hat{\underset{\_}{\phi}}\left( t_{k} \right)}}},$

H=[δ_(0,index)δ_(1,index) . . . δ_(l−1,index)0]εR^(1×(l+1)),

and δ_(i,j) is the Kronecker delta defined earlier.

With probing, and referring to equation (35), the system parameters may be modified as follows: $\begin{matrix} \begin{matrix} {C_{p} = \quad \left\lbrack {\begin{matrix} 0 & \cdots & 0 & \left. 1 \right\rbrack \end{matrix} \in R^{1 \times {({{2l} + 1})}}} \right.} \\ {K_{p} = \quad \left\lbrack {\begin{matrix} k_{1} & \cdots & k_{l} & \left. \begin{matrix} 0 & \begin{matrix} \begin{matrix} \cdots & 0 \end{matrix} & k_{l + 1} \end{matrix} \end{matrix} \right\rbrack \end{matrix}^{T} \in R^{{2l} + 1}} \right.} \\ {{\hat{A}}_{p} = \quad {\begin{bmatrix} 0 & \cdots & \quad & 0 & \delta_{{no}\quad \_ \quad {pert}} & 0 & 0 & \delta_{pert} & 0 \\ 1 & 0 & \cdots & \quad & \quad & \quad & \quad & 0 & 0 \\ 0 & 1 & 0 & \quad & \vdots & \quad & \quad & \vdots & \vdots \\ \vdots & \quad & ⋰ & ⋰ & \quad & \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad & \quad & \quad & \quad & \quad & \quad \\ \quad & \quad & \quad & \quad & \quad & ⋰ & 0 & 0 & 0 \\ 0 & \cdots & \cdots & \quad & \quad & 0 & 1 & 0 & 0 \\ {{\hat{c}}_{1}\left( {1 - {\hat{k}}_{s}} \right)} & \quad & \cdots & \quad & {{\hat{c}}_{N}\left( {1 - {\hat{k}}_{s}} \right)} & 0 & \cdots & 0 & {\hat{k}}_{s} \end{bmatrix} \in}} \\ {\quad R^{{({{2l} + 1})} \times {({{2l} + 1})}}} \end{matrix} & (41) \end{matrix}$

where the elements k_(i) of K_(p) are taken from equation (38), and δ_(pert) and δ_(no) _(—) _(pert) are defined as before. With equation (41) the observer (sampled q times per firing event) is given as: $\begin{matrix} \begin{matrix} {{{\underset{\_}{\hat{\phi}}}_{p}\left( t_{j} \right)} = {{\left\lbrack {{\hat{A}}_{p} - {K_{p}C_{p}}} \right\rbrack {{\underset{\_}{\hat{\phi}}}_{p}\left( t_{j - 1} \right)}} + {K_{p}{y\left( t_{j - 1} \right)}}}} \\ {{\hat{y}\left( t_{j} \right)} = {C_{p}{{\underset{\_}{\hat{\phi}}}_{p}\left( t_{j} \right)}}} \end{matrix} & (42) \end{matrix}$

and the corresponding controller (sampled once per firing event) is

z (t _(k))=Fz (t _(k−1))+Ge(t _(k−1))

u (t _(k))=Lu (t _(k−1))+Mz (t _(k−1))+Ne(t _(k−1))

Δu(t _(k−1))=U _(z) z (t _(k−1))+U _(u) u (t _(k−1))+Ve(t _(k−1))  (43)

with ${e\left( t_{k - 1} \right)} = \left\{ \begin{matrix} 0 & {{if}\quad ({pert})} \\ {H_{p}{{\hat{\underset{\_}{\phi}}}_{p}\left( t_{k} \right)}} & {{else},} \end{matrix} \right.$

H_(p)=[δ_(0,index)δ_(1,index) . . . δ_(l−1,index)0 . . . 0]εR^(1×(2l+1)),

and δ_(i,j)

is the Kronecker delta defined earlier. Note that the mapping of the cylinder imbalances to the cylinders is not one-to-one anymore. Each cylinder relates to a multiple of imbalance estimates so that multiple values of the variable index provide stable individual cylinder control.

The counter variable evnt_cnt mentioned earlier counts the sampling events. It is incremented as long as it is smaller or equal to the number of sampling events per engine events l and reset to one otherwise. Each q sampling events conclude one firing event. Because the fuel probing input of equation (32) must retain its value over one complete firing event the variable mask is redefined as follows: $\begin{matrix} {{{mask}\left( t_{k} \right)} = \left\{ \begin{matrix} 1 & {{if}\quad \left( {\left( {{{evnt}\quad \_ \quad {cnt}} = 1} \right)\quad {or}\quad \left( {{{evnt}\quad \_ \quad {cnt}} = 2} \right)\quad {or}\quad \cdots \quad {or}\quad \left( {{{evnt}\quad \_ \quad {cnt}} = q} \right)} \right)} \\ 0 & {else} \end{matrix} \right.} & (44) \end{matrix}$

As indicated above, initial values for the phase variable index are determined by table look-up. The table is accessed in both a read and a write mode, respectively, the latter providing the capability to update the calibration based on the most recent engine data. The operating conditions are specified in terms of engine speed n and intake manifold pressure p_(m). These two quantities constitute the axis of the lookup table. Let the two axis be defined as axis_(p) _(m) =[p_(m) ₁ . . . p_(m) _(i) . . . p_(m) _(n) ], and axis_(n)=[n₁ . . . n_(j) . . . n_(m)], respectively, so that the table contains n×m table values t_(i,j). Then each t_(i,j) contains the value index pertaining to the operating point determined by the axis values p_(m) _(i) and n_(j), i.e.,

t _(i,j)=index(p _(m) _(i) , n _(j))  (45)

The quantization or granularity Δp_(m)=p_(m) _(i) −p_(m) _(i−1) and Δn=n_(j)−n_(j−1), respectively, must be chosen experimentally such that the differences of the values index pertaining to two adjacent operating points does not exceed one. In other words with equation (45),

|t _(i,j) −t _(i−1,j)|≦1 and |t _(i,j) −t _(i,j−1)|≦1 and |t _(i,j) −t _(i−1,j−1)|≦1∀i,j  (46)

For a given vehicle type, the table values t_(i,j) can be calibrated off-line for each table grid point (p_(m) _(i) , n_(j)) by either using the “trial and error” method or by applying probing and calculating method of equation (37). For any given operating point (p_(m)(t_(k)), n(t_(k))) the table value is scheduled such that it corresponds to the closest grid point (p_(m) _(i) , n_(j)). To provide a formalized description of the scheduling mechanism let S_(p)=(p_(m) ₁ , p_(m) ₂ , p_(m) ₃ , . . . p_(m) _(n) ) and S_(n)=(n₁, n₂, n₃, . . . , n_(m)) denote the well ordered countable sets of grid points on the pressure and the speed axis, respectively, and define the ordinal number for each element x_(i) of a well ordered countable set S_(x)=(x₁, x₂, . . . , x_(i), . . . , x_(p)) as

ord(x _(i))=i  (47)

Furthermore assume that x_(i)≦x(t_(k))<x_(i+1) and define $\begin{matrix} {{{round}\left( {x\left( t_{k} \right)} \right)} = \left\{ \begin{matrix} x_{i} & {{{if}\quad \frac{{{x\left( t_{k} \right)} - x_{i}}}{{x_{i + 1} - x_{i}}}} < 0.5} \\ x_{i + 1} & {else} \end{matrix} \right.} & (48) \end{matrix}$

Then for each operating point (p_(m)(t_(k)), n(t_(k))) the table values index are scheduled as follows: $\begin{matrix} {\left. \left. \begin{matrix} {i = {{ord}\left( {{round}\left( {p_{s}\left( t_{k} \right)} \right)} \right)}} \\ {j = {{ord}\left( {{round}\left( {n\left( t_{k} \right)} \right)} \right)}} \end{matrix} \right\}\Rightarrow{index} \right. = t_{i,j}} & (49) \end{matrix}$

Conversely, after a probing sequence under steady state engine operating conditions (characterized by a operating point (p_(m)(t_(k)), n(t_(k)))) the new evaluated value index is used to update the table value corresponding to the closest grid point (p_(m) _(i) , n_(j)), that is, in formalized notation: $\begin{matrix} {\left. \left. \begin{matrix} {i = {{ord}\left( {{round}\left( {p_{s}\left( t_{k} \right)} \right)} \right)}} \\ {j = {{ord}\left( {{round}\left( {n\left( t_{k} \right)} \right)} \right)}} \end{matrix} \right\}\Rightarrow t_{i,j} \right. = {index}} & (50) \end{matrix}$

The above-described control is summarized by the flow diagram of FIG. 4, which represents computer program instructions executed by the engine controller 52 of FIG. 2. The control is initialized at engine start-up by setting an emergency reset flag (reset) for all integrator state variables, and resetting a sample counter variable (samp cnt) used to identify sampling events that coincide with a firing event. At each sampling event, the blocks 142-154 are executed as shown. The block 142 updates the observer equation (39) or (42) depending on whether probing is in effect, calculates the performance measure σ(t_(k)) and its critical value using equations (28) and (31), and gets the index value by table look up per equation (49). Initially, the reset flag (checked at block 144) will be set, and blocks 146-148 are executed. Block 146 resets the controller integrators z, u and flags, while block 148 updates the trim variable υ(t_(k)) using equation (15) and updates the system counter variables. If the reset flag is not set, the block 150 is executed to check for phase offset (using either the trial-and-error or probing methods), and to re-evaluate the index value using equation (50). Block 152 then checks the status of the sample counter variable, and block 154 updates the controller terms accordingly.

In summary, the present invention provides a method of achieving individual cylinder air/fuel control based on sampled readings of a single oxygen sensor responsive to the combined exhaust gas flow of several engine cylinders, using a model-based observer to reproduce the imbalances of the different cylinders and a proportional-plus-integral controller is used for their elimination. While this invention has been described in reference to the illustrated embodiment, it is expected that various modifications in addition to those suggested above will occur to those skilled in the art. In this regard, it will be understood that the scope of this invention is not limited to the illustrated embodiment, and that fuel controls incorporating such modifications may fall within the scope of this invention, which is defined by the appended claims. 

What is claimed is:
 1. A control method for fueling N individual cylinders of a multi-cylinder internal combustion engine based on an output signal of an oxygen sensor positioned to respond to a combination of exhaust gases generated in the individual cylinders, the control method comprising the steps of: sampling the oxygen sensor output signal sampling events that occur in synchronism with firing events in each of the individual cylinders; filtering the oxygen sensor signal samples to define a nominal air/fuel ratio trajectory; utilizing an observer model to define N state variables estimating air/fuel imbalances in each of the N different cylinders, and an additional state variable estimating a deviation of the sensed A/F ratio from said nominal air/fuel ratio trajectory; measuring a deviation of the sensed air/fuel ratio from the nominal air/fuel ratio trajectory at each sampling event, and updating all of the state variables based on a difference between such measured deviation and the estimated deviation given by said additional state variable; retrieving a previously stored index that associates the N state variables with corresponding individual cylinders; fueling the individual cylinders based on the associated observer state variables using a closed-loop feedback control; computing a control performance measure based on a sum of the indicated air/fuel ratio imbalances; and if the performance measure indicates unstable air/fuel ratio control, identifying a new index value associating the N state variables with the individual cylinders, and storing the new index value in place of the retrieved index.
 2. The control method of claim 1, wherein nominal air/fuel ratio trajectory is filtered over a plurality of engine cycles.
 3. The control method of claim 1, wherein unstable air/fuel ratio control is indicated when at least a predefined increase in the performance measure is detected.
 4. The control method of claim 1, wherein the observer model includes both the oxygen sensor and mixing of the exhaust gases upstream of the oxygen sensor.
 5. The control method of claim 1, wherein the observer model and the closed-loop feedback control are both represented as a rotational system.
 6. The control method of claim 1, wherein the step of identifying a new index value comprises the steps of: temporarily disabling the closed-loop feedback control; superimposing a periodic probing signal on the fuel supplied to a single cylinder over an even number of firing events under steady state operation of the engine; monitoring the N state variables to identify a maximal response to the probing signal; and identifying the new index value based on the identified maximal response. 